#!/usr/bin/env python
# coding: utf-8

# In[6]:


file = open('a.txt','r')


# In[12]:


file = open('a.txt','r',encoding = 'utf-8') #得用utf-8才能读出正确不乱码的文字
print(file.read())
file.close() #不关闭占内存


# In[13]:


with open('c.txt','w') as file: #以写的方式打开从c.txt,作为file
    file.write('This is the first file')
    


# In[15]:


with open('c.txt','a') as file:  # a 就是追加文件
    file.write('this is the second input')  


# In[16]:


name = ['aaa', 'bbb', 'ccc']
with open('c.txt', 'w') as file:
    file.writelines(name)


# In[17]:


name = ['aaa', 'bbb', 'ccc']
with open('c.txt', 'w') as file:
    file.writelines([n + '\n' for n in name]) #改成列表生成式[](形态+方式)\n换行


# In[18]:


with open('a.txt','r',encoding = 'utf-8') as file:
    print(file.read(3)) #就是3个数


# In[20]:


with open('b.txt','r') as file:  
   #seek中的参数，表示移动到的位置，而不是移动的位移。位置从0开始
    file.seek(2)                   #seek是移动指针，
    print(file.read(3))
    file.seek(2)                   #seek是移动指针，移动到多少，从下标0开始，到2的位置开始
    print(file.read(3))


# In[22]:


with open('b.txt','r') as file:  
   #read的时候，指针有没有移动：有移动
                   
    print(file.read(3))
                   
    print(file.read(3))


# In[24]:


#读一行
with open('b.txt','r') as file:
    number = 0
    while True:                 #或者while 1:
        number += 1
        line = file.readline()
        if line =='':
            break
        print(number, line, end = '\n')


# In[26]:


#读多行
with open('b.txt','r') as file:
    num = file.readlines()
    print(num)
    for n in num:
        print(n) #print本身就有一行


# In[27]:


with open('b.txt','r') as file:
    
    num = file.read()
    print(num)
    


# In[ ]:


['123\n456\n789\n']细粒度


# In[30]:


import os
print(os.name, os.linesep, os.sep) #os.linesep是回车


# In[31]:


#获取绝对路径
import os
print(os.path.abspath('b.txt'))


# In[37]:


#获取当前目录
import os
print(os.getcwd())
with open(r'C:\Users\shida\b.txt','r', encoding = 'utf-8') as file:
    print(file.read())


# In[38]:


import os
print(os.getcwd())
with open(r'demo\d.txt','r', encoding = 'utf-8') as file:
    print(file.read())


# In[40]:


import os 
print(os.path.join(os.getcwd(),'demo\\d.txt'))


# In[41]:


import os 
print(os.path.exists('E:\\demo'))
print(os.path.exists('demo'))


# In[42]:


#创建目录 ，os.mkdir()

import os
os.mkdir('demo')


# In[43]:


import os
if not os.path.exists('demo'):
    os.mkdir('demo')
else:
    print('目录已存在')


# In[45]:


#创建demo下一级目录
import os
def mkdir(path):
    if not os.path.isdir(path):
        mkdir(os.path.split(path)[0])
    else:
        return 
    os.mkdir(path)
mkdir('demo\\111')


# In[48]:


#创建多级目录
import os
os.makedirs('E:\\demo\\dir1\\dir2\\demo\\dir1')


# In[50]:


#删除目录。remdir删除的是空文件的目录

import os, shutil
if os.path.exists('E:\\demo\\dir1'):
    #os.rmdir('E:\\demo\\dir1\\dir2\\demo\\dir1')
    shutil.rmtree('E:\\demo\\dir1') #这个可以删除所有，但是必须有根目录
else:
    print('目录不存在')


# In[56]:


import os
path = 'E:\\demo'
for root, dirs, files in os.walk(path, topdown = True):
    print(root)
    print(dirs)
    print(files)
    for dirname in dirs:
        print('dir;',os.path.join(root,dirname))
    for filename in files:
        print('file;',os.path.join(root,filename))


# In[58]:


import os
if os.path.exists(r'E:\demo\1.txt'):
    os.remove(r'E:\demo\1.txt')
else:
    print('file not found!')
    


# In[59]:


# 重命名
import os
if os.path.exists(r'E:\demo\1.txt'):
    os.rename(r'E:\demo\1.txt',r'E:\demo\5.txt',)
else:
    print('file not found!')


# In[67]:


import zipfile
with zipfile.ZipFile('E:\\demo\\5.zip', mode = 'w', compression = zipfile.ZIP_DEFLATED) as zf:
    zf.write('E:\\demo\\5.txt')

    


# In[68]:



#解压缩
with zipfile.ZipFile('E:\\demo\\5.zip') as zf:
print(zf.namelist())
for filename in zf.namelist():
    zf.extract(filename, '.')


# In[ ]:


#爬取静态网页之新浪滚动新闻的爬取
import requests
import re
from bs4 import BeautifulSoup
import lxml 

##爬虫源头王爷的源码
#url = "http://roll.news.sina.com.cn/news/gnxw/gdxw1/index.shtml"

#下载源码
#res = requests.get(url)
#res.encoding = 'gb2312'
#res.encoding
#print(res.text[:500])
#从根网页的源码中找到那些需要爬取的新闻网址
#pattern = r'http://news.sina.com.cn/[a-z]{1}/[0-9a-z/.\-]+shtml'
#urls = re.findall(pattern,res.text)

#print(len(urls))
#print(res.text)

#获取新闻网页内容
def getnewspage(url):
    res = requests.get(url)
    res.encoding = 'utf-8'
    return res.text
#保存至本地文件
def savepage(page,filename):
    f = open(filename,'wb')
    f.write(page.encode('utf-8'))
    f.close()

pno = 5#爬几页
#循环爬取
for p in range(1,pno+1):
    #构造根网页的网址
    url = 'http://roll.news.sina.com.cn/news/gnxw/gdxw1/index_{pn}.shtml'.format(pn = p)
    #下载根网页的源码
    res = requests.get(url)
    res.encoding = 'gb2312'
    #urls保存王爷对应的网页链接，是个列表
    pattern = r'http://news.sina.com.cn/[a-z]{1}/[0-9a-z/.\-]+shtml'
    urls = re.findall(pattern,res.text)    
#遍历urls，依次爬取网页内容
    for u in urls:                                                                                                                   
        pc = getnewspage(u)
        filename = 'E:\\news\\' + u[u.rindex('/')+1:u.rindex('.')] + '.txt'
        savepage(pc,filename)


# In[ ]:


from bs4 import BeautifulSoup
from datetime import datetime
import os
import traceback

#读取指定目录中的每个html文件
#解析，提取：标题、时间、作者、来源、正文
#保存在本地文件中

def get_news(htmlfile):
    #新闻信息字典
    news_dict = {}
    #打开并读取文件
    try:
        #打开文件
        f = open(htmlfile, encoding = 'utf-8')
        #读取文件
        fcontent = f.read()
        #转为DOM树
        soup = BeautifulSoup(fcontent, 'lxml')
        # 提取标题title。（数据清洗）
        #select 方法作用于h1.main-title获得的是一个列表，
        #我们事先确定main-title是独一无二的，因此，列表只有一个元素
        #因此，soup.select('h1.main-title')[0]拿到了带有标签信息的标签元素总体信息
        #我们要的是，实际内容，不要标签描述。采用.text获得。
        news_title = soup.select('h1.main-title')[0].text.strip()
        # 装进字典
        news_dict['title'] = news_title
        # 获取时间,soup.select('span.date')[0].text.strip()是字符串
        nt = datetime.strptime(soup.select('span.date')[0].text.strip(), '%Y年%m月%d日 %H:%M')
        news_time = datetime.strftime(nt, '%Y-%m-%d %H:%M')
        #装进字典
        news_dict['time'] = news_time
        #获取新闻源
        news_source = soup.select('.source')[0].text.strip()
        #装进字典
        news_dict['source'] = news_source
        #获取作者
        news_author = soup.select('.show_author')[0].text.strip()
        #装进字典
        news_dict['author'] = news_author
        #获取正文
        news_article  =soup.select('div#article > p')
        #news_article 存储的是一个包含若干个div标签的子标签p的列表(>是子标签）。
        # 我们要遍历这个列表，将每一个p中的信息提取出来，连接在一起，即为正文内容。
        news_article_text = ''
        for na in news_article:
            news_article_text += na.text.strip()
        # 装进字典
        news_dict['article'] = news_article_text
    except Exception as e:
        print('抓取出错，此条新闻略过')
        print(e)
        traceback.print_exc()
        return None
    #print(htmlfile)
    #print('time: %s title: %s author: %s source: %s' %(news_time,news_title,news_author,news_source))
    return news_dict

# 保存所有新闻内容 （保存正文）,将newslist中的正文，保存到filename
def save_text(filename, newslist):
    newstext = ''
    #neslist是一个字典列表，每个元素n都是一个新闻字典
    for n in newslist:
         newstext += n['article'] + '\r\n'
    #保存文件
    f = open(filename, 'wb')
    f.write(newstext.encode('utf-8'))
    f.close()

if __name__ == '__main__':
    htmldir = "E:\\news"
    #遍历新闻文件夹
    fs = os.walk(htmldir)
    #用列表allnews来装载所有新闻字典
    allnews = []
    #遍历所有的目录和文件
    for d, s, fns in fs: #d是根目录 （str),s是子目录列表（list),fns是文件名列表（list)
        #遍历文件
        for fn in fns:
            
            singlenews = get_news(htmldir + os.sep + fn)
            #singlenews = get_news(os.path.abspath(fn))
            if singlenews != None:
                allnews.append(singlenews)
    #将allnews保存至E:\news\news.txt中
    save_text(r'E:\news\news.txt',allnews)
        


# In[4]:


import sqlite3
conn = sqlite3.connect('students.db')
cursor = conn.cursor()
cursor.execute('create table if not exists user (id int(10) primary key, name varchar(20))')
cursor.close()
conn.commit()
conn.close()


# In[ ]:




